import axios from 'axios'
// import { Notification, MessageBox, Message } from "element-plus";
// import store from '@/store'
// import { getToken } from "@/utils/auth";
// import errorCode from "@/utils/errorCode";

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000
})

const cacheMap = new WeakMap()
// 串行, 显示Loading的请求数
let loadingRequestCount = 0
// 是否关闭loading
function whetherCloseLoading(showLoading) {
  if (showLoading) {
    loadingRequestCount--
    if (loadingRequestCount === 0) {
      // uni.hideLoading()
    }
  }
}

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    // const isToken = (config.headers || {}).isToken === false;
    // if (getToken() && !isToken) {
    //   config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
    // }
    return config
  },
  (error) => {
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200
    // 获取错误信息
    // const msg = errorCode[code] || res.data.msg || errorCode["default"];
    const msg = 'msg~'
    if (code === 401) {
      // MessageBox.confirm(
      //   "登录状态已过期，您可以继续留在该页面，或者重新登录",
      //   "系统提示",
      //   {
      //     confirmButtonText: "重新登录",
      //     cancelButtonText: "取消",
      //     type: "warning",
      //   }
      // ).then(() => {
      //   store.dispatch("LogOut").then(() => {
      //     location.href = "/index";
      //   });
      // });
    } else if (code === 500) {
      // Message({
      //   message: msg,
      //   type: "error",
      // });
      return Promise.reject(new Error(msg))
    } else if (code !== 200) {
      // Notification.error({
      //   title: msg,
      // });
      return Promise.reject('error')
    } else {
      return res.data
    }
  },
  (error) => {
    console.log('err' + error)
    let { message } = error
    if (message == 'Network Error') {
      message = '后端接口连接异常'
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.substr(message.length - 3) + '异常'
    }
    // Message({
    //   message: message,
    //   type: "error",
    //   duration: 5 * 1000,
    // });
    return Promise.reject(error)
  }
)

export default async function ({ showLoading = true, cache = false, ...option }) {
  // 做自定义config 拦截
  let requestCacheKey
  if (cache) {
    requestCacheKey = JSON.stringify(option)
    if (cacheMap.has(requestCacheKey)) {
      console.log('get cache', requestCacheKey, cacheMap.get(requestCacheKey))
      return cacheMap.get(requestCacheKey)
    }
  }

  if (showLoading) {
    if (loadingRequestCount === 0) {
      // uni.showLoading({
      //   title: '加载中',
      //   mask: true
      // })
    }
    loadingRequestCount++
  }
  try {
    const res = await service(option)

    // 测试用
    if (process.env.VUE_APP_DEBUG === 'DEBUG' && process.env.NODE_ENV === 'production') {
      console.info({ cache, ...option, ...res })
    }
    if (res.code === 200) {
      // 缓存请求 MAYBE: 过期时间
      if (cache) {
        cacheMap.set(requestCacheKey, res.data)
      }
    }
    return res
  } catch (error) {
    //
    console.log(error)
  }

  whetherCloseLoading(showLoading)
}
